package cn.com.huzo.repository.purchase;

import cn.com.huzo.model.entities.purchase.PoLinesEntity;
import huzofw.repository.GenericRepository;
import java.util.List;
import java.util.Map;

/**
 * 采购订单数据明细访问对象接口。
 *
 * @author 吴旭
 */
public interface PoLinesRepository extends GenericRepository<PoLinesEntity, String> {

    /**
     * 取得本次订单的材料
     *
     * @param headerId 订单标识
     * @return
     */
    List<PoLinesEntity> fetchPoMaterialList(Long headerId);

    /**
     * 根据选定的订单得到满足条件的明细记录数
     *
     * @param criterion
     * @return
     */
    Integer fetchForCountByPoNo(Map<String, Object> criterion);

    /**
     * 根据选定的订单得到满足条件的明细记录翻页数据
     *
     * @param criterion
     * @return
     */
    List<PoLinesEntity> fetchForPageByPoNo(Map<String, Object> criterion);

    /**
     * 取得选择的订单全部明细ID
     *
     * @param criterion
     * @return
     */
    List<String> fetchAllSelectedLines(Map<String, Object> criterion);

    /**
     * 引入调达表明细到订单明细。
     *
     * @param headerId 订单标识
     * @param updatedBy 操作者
     * @param mrpLinesKeyList 本次引入的调达表明细
     * @param separateFlagByPartOfNeed 是否通过使用部位进行采购区分
     * @return 影响行数
     */
    Integer insertByImportedMrpLines(Long headerId, Long updatedBy,
            List<String> mrpLinesKeyList,
            Short separateFlagByPartOfNeed);

    /**
     * 引入补料单明细到订单明细。
     *
     * @param headerId 订单标识
     * @param updatedBy 操作者
     * @param mrpFeedingLinesKeyList 本次引入的补料单明细
     * @param separateFlagByPartOfNeed 是否通过使用部位进行采购区分
     * @return 影响行数
     */
    Integer insertByImportedMrpFeedingLines(Long headerId, Long updatedBy,
            List<String> mrpFeedingLinesKeyList,
            Short separateFlagByPartOfNeed);

    /**
     * 更改订单明细材料
     *
     * @param itemList 要更新材料的订单明细
     * @return 影响行数
     */
    Integer updateRowMaterial(List<PoLinesEntity> itemList);

    /**
     * 同步更新BOM材料
     *
     * @param itemList 要更新材料的订单明细
     * @return 影响行数
     */
    Integer syncUpdateMainBomLinesMaterial(List<PoLinesEntity> itemList);

    /**
     * 同步更新调达表材料规格
     *
     * @param itemList 要更新材料的订单明细
     * @return 影响行数
     */
    Integer syncUpdateMrpLinesMaterialSpecification(List<PoLinesEntity> itemList);

    /**
     * 删除空引用的调达表及补料单
     *
     * @param headerId 采购订单标识
     * @return 影响行数
     */
    Integer delete_for_sync_lines(Long headerId);

    /**
     * 取得本次订单的全部明细，用于打印
     *
     * @param criterion 导出条件
     * @return
     */
    List<PoLinesEntity> fetchLinesWithOutSubTotal(Map<String, Object> criterion);

    /**
     * 取得本次订单的全部明细(带小计)，用于打印
     *
     * @param criterion 导出条件
     * @return
     */
    List<PoLinesEntity> fetchLinesWithSubTotal(Map<String, Object> criterion);
}
